<!DOCTYPE html>
<html lang="en">

  <head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
  </head>

  <body>
    <script>
      /*
            借用：
                借过来使用 -- 代码复用

                主要通过三个方法
                    call/apply/bind
                
                这三个方法是从函数的原型上来的
        */

      // console.dir(Function)
      // 1.Function 构造函数，是所有的函数的 构造函数
      // 函数也是被new出来的 -- 万物皆对象 -- 任何一个函数也是对象
      //function fn() {} // 其实省略了fn = new Function()
      // 证明 所有的函数 都是 Function 的实例
      //console.log(fn.__proto__.constructor === Function) //true


      //2.平常的函数省略了Function构造函数实例化的过程
      //let fn = new Function(参数1, 参数2, ...参数n, 函数体)

      // function add(a, b) {
      //   return a + b
      // }
      // let add = new Function('a', 'b', 'return a + b')
      // console.log(add(10, 20)); //30


      // 3.所有的函数，都是 Function 的实例对象，就可以调用 Function.prototype 上面的方法
      console.dir(Function);
      console.dir(Function.prototype); // 发现 ， Function的原型上 有 call/apply/bind 方法


      // 4.昨天的借用构造函数 Perosn 就可以调用 call 方法
      // function Person(){}
      // Person.call()
    </script>
  </body>

</html>